Share code on platforms
日付:2021/05/06
URL:https://kotlinlang.org/docs/mpp-share-on-platforms.html
調査者:mayamito
カテゴリ:KMP(Kotlin Multiplatform)
一言で表すと
Kotlin/MPPでのコード共有が従来より便利になるよ
概要
従来のKotlin/MPPでは、platform specificなコードはたとえ内容が全く一緒でもターゲットごとにコードを書く必要があった。
例えばdesktop向けのKotlin/Nativeの場合、posix由来の関数を使いたい場合はWindows, Linux, Macそれぞれで同じコードを書く必要がある。
code:kotlin
import platform.posix.*
fun printFile(path: String) {
val fp = fopen(path, "r") ?: return
val stringBuilder = StringBuilder()
memScoped {
val buf = allocArray<ByteVar>(BUF_SIZE)
while (true) {
val nextLine = fgets(buf, BUF_SIZE, fp)?.toKString()
if (nextLine == null) {
break
} else {
stringBuilder.append(nextLine)
}
}
fclose(fp)
}
println(stringBuilder.toString())
}
↑例えばこれを3回書く必要がある
あるいはbuild.gradleで頑張る
code:kotlin
kotlin {
val hostOs = System.getProperty("os.name")
val hostTarget = when {
hostOs == "Mac OS X" -> macosX64("cli")
hostOs == "Linux" -> linuxX64("cli")
hostOs.startsWith("Windows") -> mingwX64("cli")
else -> throw GradleException("Host OS '$hostOs' is not supported in Kotlin/Native $project.")
}
hostTarget.apply {
binaries {
executable {
entryPoint = "com.example.app.main"
}
}
compilations"main".enableEndorsedLibs = true
}
...
}
Mori Atsushi.icon これはTURAI
これからは、ターゲットプラットフォームを階層的に定義することにより、このようなコードを書く必要がなくなる。
gradle.propertiesに以下を追加する。
code:groovy
kotlin.mpp.enableGranularSourceSetsMetadata=true
build.gradle.ktsのkotlinブロックを以下のように定義する。
code:kotlin
kotlin{
sourceSets {
val desktopMain by creating {
dependsOn(commonMain)
}
val linuxX64Main by getting {
dependsOn(desktopMain)
}
val mingwX64Main by getting {
dependsOn(desktopMain)
}
val macosX64Main by getting {
dependsOn(desktopMain)
}
}
}
これで3つのターゲットを1つのコードで扱えるようになる(らしい)
気になるポイント
まとめたプラットフォームのうち1つだけちょっと変えたいときとかどうするんだろ
M1 Mac向けのターゲットはあるのか:thinking:
メモ
コメント
Go.icontvosとwatchosもターゲットにできるとは知らなんだ
Mori Atsushi.icon if文かけないかな?
:chigi: ↑そうなったらもうモデリングに失敗してそう
Mori Atsushi.icon M1 macとかって出てる?
これを見る感じ不明 https://kotlinlang.org/docs/mpp-supported-platforms.html